## 实验十  插件RGB模块调节LED颜色

![img](./media/wps117.png) 

**实验说明**

在这个套件中，有一个Keyes DIY电子积木 共阴RGB模块，它采用F10-全彩RGB雾状共阴LED元件。控制时，我们需要将模块R G B连接单片机PWM口，剩下那个管脚接GND（共阳RGB的话剩下那个管脚接VCC）。

实验中，我们通过测试代码，控制RGB模块显示几个常见的颜色。

 

**实验原理**

![image-20260421184259622](./media/image-20260421184259622.png)

那么什么是PWM呢？PWM是使用数字手段来控制模拟输出的一种手段。使用数字控制产生占空比不同的方波（一个不停在高电平与低电平之间切换的信号)来控制模拟输出。一般来说端口的输入电压只有两个0V与3.3V，也就是低电平和高电平。如果想要改变灯的亮度怎么办呢个？有同学说串联电阻，对，这个方法是正确的。但是，如果想要得到不同的亮度，且在不同亮度之间来回变动怎么办呢？不可能不停地切换电阻吧。这种情况下就需要使用PWM了，那它是怎么控制的呢？

数字端口电压输出只有LOW与HIGH两个，对应的就是0V与3.3V的电压输出，可以把LOW定义为0，HIGH定义为1，1秒内让单片机输出500个0或者1的信号。如果这500个全部为1，那就是完整的3.3V，如果全部为0，那就是0V。如果010101010101这样输出，刚好一半，端口输出的平均电压就为1.65V了。这个和放映电影是一个道理，咱们所看的电影并不是完全连续的，它其实是每秒输出25张图片。在这种情况下，人的肉眼是分辨不出来的，看上去就是连续的了。PWM也是同样的道理，如果想要不同的电压，就控制0与1的输出比例控制就可以了。当然这和真实的连续输出还是有差别的，单位时间内输出的0,1信号越多，控制的就越精确。

那么我们这个实验就是要通过调节3个PWM值，控制LED元件显示红光、绿光和蓝光的比例，从而控制RGB模块上LED显示不同颜色灯光。当设置的PWM值越大，对应显示的颜色比例越重。理论上来说，通过调节这3中颜色光的混合比例，可以模拟出所有颜色的灯光。



![img](./media/wps119.jpg) 



**实验器材**

| ![img](./media/wps120.jpg) | ![img](./media/wps121.jpg) | ![img](./media/wps122.jpg)      | ![img](./media/wps123.png) | ![img](./media/wps124.jpg) |
| -------------------------- | -------------------------- | ------------------------------- | -------------------------- | -------------------------- |
| Raspberry Pi Pico板*1      | Raspberry Pi Pico扩展板*1  | keyes DIY电子积木 共阴RGB模块*1 | 防反插4Pin*1               | MicroUSB线*1               |

 

**接线图**

![img](./media/wps125.png) 

 

**测试代码**

代码1：

```c
/* 

 * Keyes Starter Kit for Raspberry Pi Pico

 * lesson 10.1

 * rgb_1

*/

int redPin = 9; //定义红色接GP9

int greenPin = 10; //定义绿色接GP10

int bluePin = 11; //定义蓝色接GP11

void setup(){

 //输出口都设置为输出模式

 pinMode(redPin, OUTPUT);

 pinMode(greenPin, OUTPUT);

 pinMode(bluePin, OUTPUT);

}

 

void loop(){

 //红色

 digitalWrite(redPin,HIGH);

 digitalWrite(greenPin,LOW);

 digitalWrite(bluePin,LOW);

 delay(1000);

 //绿色

 digitalWrite(redPin,LOW);

 digitalWrite(greenPin,HIGH);

 digitalWrite(bluePin,LOW);

 delay(1000);

 //蓝色

 digitalWrite(redPin,LOW);

 digitalWrite(greenPin,LOW);

 digitalWrite(bluePin,HIGH);

 delay(1000);

 

}
```

 

代码2：

```c
/* 

 * Keyes Starter Kit for Raspberry Pi Pico

 * lesson 10.2

 * rgb_2

*/

int redPin = 9; //定义红色接GP9

int greenPin = 10; //定义绿色接GP10

int bluePin = 11; //定义蓝色接GP11

void setup() {

 pinMode(redPin, OUTPUT);

 pinMode(greenPin, OUTPUT);

 pinMode(bluePin, OUTPUT);

}

void loop() {

 //红色(255, 0, 0)

 analogWrite(9, 255);

 analogWrite(10, 0);

 analogWrite(11, 0);

 delay(1000);

 //橙色(255, 97, 0)

 analogWrite(9, 255);

 analogWrite(10, 97);

 analogWrite(11, 0);

 delay(1000);

 //黄色(255, 255, 0)

 analogWrite(9, 255);

 analogWrite(10, 255);

 analogWrite(11, 0);

 delay(1000);

 //绿色(0, 255, 0)

 analogWrite(9, 0);

 analogWrite(10, 255);

 analogWrite(11, 0);

 delay(1000);

 //蓝色(0, 0, 255)

 analogWrite(9, 0);

 analogWrite(10, 0);

 analogWrite(11, 255);

 delay(1000);

 //青色(0, 255, 255)

 analogWrite(9, 0);

 analogWrite(10, 255);

 analogWrite(11, 255);

 delay(1000);

 //紫色(160, 32, 240)

 analogWrite(9, 160);

 analogWrite(10, 32);

 analogWrite(11, 240);

 delay(1000);

 

}
```

**代码说明**

代码1说明：

1. 代码1中，R G B代表控制模块上 LED对应的红绿蓝3种颜色对应的端口，根据接线图我们接到了GP9 GP10 GP11，设置为9 10 11，后面设置对应高低，设置GRB LED中红绿蓝3个灯是否会亮，设置为高（对应数字口为高电平），对应的颜色就亮。
2. 现在观察代码，这个代码非常简单，只是简单的控制模块上RGB LED显示红色1秒、  

绿色1秒、蓝色1秒，循环交替。 

 

 

代码2说明：

1.代码2中，我们使用到了PWM输出，根据接线图我们接到了GP9 GP10 GP11，设置为9 10 11。后面设置数据代表设置模块上LED 红绿蓝颜色的比例，设置的数据越大（对应的PWM值越大），设置该颜色的比例越大。(注意：pico的PWM输出正常为0~65535，这里我们使用arduino IDE调到了0~255)。

2.实验中我们通过设置对应数值，调节RGB LED上红绿蓝颜色比例，从而控制RGB LED显示对应颜色。所以理论上来说可以设置的颜色有256*256*256种（详细可参考下面常用RGB颜色表）。

 

 

 

**常用RGB颜色表**

|             | R    | G    | B    |             | R    | G    | B    |          | R    | G    | B    |
| ----------- | ---- | ---- | ---- | ----------- | ---- | ---- | ---- | -------- | ---- | ---- | ---- |
| 黑色        | 0    | 0    | 0    | 黄色        | 255  | 255  | 0    | 浅灰蓝色 | 176  | 224  | 230  |
| 象牙黑      | 41   | 36   | 33   | 香蕉色      | 227  | 207  | 87   | 品蓝     | 65   | 105  | 225  |
| 灰色        | 192  | 192  | 192  | 镉黄        | 255  | 153  | 18   | 石板蓝   | 106  | 90   | 205  |
| 冷灰        | 128  | 138  | 135  | dougello    | 235  | 124  | 85   | 天蓝     | 135  | 206  | 235  |
| 石板灰      | 112  | 128  | 105  | forum gold  | 255  | 227  | 132  |          |      |      |      |
| 暖灰色      | 128  | 128  | 105  | 金黄色      | 255  | 215  | 0    | 青色     | 0    | 255  | 255  |
|             |      |      |      | 黄花色      | 218  | 165  | 105  | 绿土     | 56   | 94   | 15   |
| 白色        | 255  | 255  | 255  | 瓜色        | 227  | 168  | 105  | 靛青     | 8    | 46   | 84   |
| 古董白      | 250  | 235  | 215  | 橙色        | 255  | 97   | 0    | 碧绿色   | 127  | 255  | 212  |
| 天蓝色      | 240  | 255  | 255  | 镉橙        | 255  | 97   | 3    | 青绿色   | 64   | 224  | 208  |
| 白烟        | 245  | 245  | 245  | 胡萝卜色    | 237  | 145  | 33   | 绿色     | 0    | 255  | 0    |
| 白杏仁      | 255  | 235  | 205  | 桔黄        | 255  | 128  | 0    | 黄绿色   | 127  | 255  | 0    |
| cornsilk    | 255  | 248  | 220  | 淡黄色      | 245  | 222  | 179  | 钴绿色   | 61   | 145  | 64   |
| 蛋壳色      | 252  | 230  | 201  |             |      |      |      | 翠绿色   | 0    | 201  | 87   |
| 花白        | 255  | 250  | 240  | 棕色        | 128  | 24   | 24   | 森林绿   | 34   | 139  | 34   |
| gainsboro   | 220  | 220  | 220  | 米色        | 163  | 148  | 128  | 草地绿   | 124  | 252  | 0    |
| ghostWhite  | 248  | 248  | 255  | 锻浓黄土色  | 138  | 54   | 15   | 酸橙绿   | 50   | 205  | 50   |
| 蜜露橙      | 240  | 255  | 240  | 锻棕土色    | 135  | 51   | 36   | 薄荷色   | 189  | 252  | 201  |
| 象牙白      | 250  | 255  | 240  | 巧克力色    | 210  | 105  | 30   | 草绿色   | 107  | 124  | 35   |
| 亚麻色      | 250  | 240  | 230  | 肉色        | 255  | 125  | 64   | 暗绿色   | 48   | 128  | 20   |
| navajoWhite | 255  | 222  | 173  | 黄褐色      | 240  | 230  | 140  | 海绿色   | 46   | 139  | 87   |
| old lace    | 253  | 245  | 230  | 玫瑰红      | 188  | 143  | 143  | 嫩绿色   | 0    | 255  | 127  |
| 海贝壳色    | 255  | 245  | 238  | 肖贡土色    | 199  | 97   | 20   |          |      |      |      |
| 雪白        | 255  | 250  | 250  | 标土棕      | 115  | 74   | 18   | 紫色     | 160  | 32   | 240  |
|             |      |      |      | 乌贼墨棕    | 94   | 38   | 18   | 紫罗蓝色 | 138  | 43   | 226  |
| 红色        | 255  | 0    | 0    | 赫色        | 160  | 82   | 45   | jasoa    | 160  | 102  | 211  |
| 砖红        | 156  | 102  | 31   | 马棕色      | 139  | 69   | 19   | 湖紫色   | 153  | 51   | 250  |
| 镉红        | 227  | 23   | 13   | 沙棕色      | 244  | 164  | 96   | 淡紫色   | 218  | 112  | 214  |
| 珊瑚色      | 255  | 127  | 80   | 棕褐色      | 210  | 180  | 140  | 梅红色   | 221  | 160  | 221  |
| 耐火砖红    | 178  | 34   | 34   |             |      |      |      |          |      |      |      |
| 印度红      | 176  | 23   | 31   | 蓝色        | 0    | 0    | 255  |          |      |      |      |
| 栗色        | 176  | 48   | 96   | 钴色        | 61   | 89   | 171  |          |      |      |      |
| 粉红        | 255  | 192  | 203  | dodger blue | 30   | 144  | 255  |          |      |      |      |
| 草莓色      | 135  | 38   | 87   | jackie blue | 11   | 23   | 70   |          |      |      |      |
| 橙红色      | 250  | 128  | 114  | 锰蓝        | 3    | 168  | 158  |          |      |      |      |
| 蕃茄红      | 255  | 99   | 71   | 深蓝色      | 25   | 25   | 112  |          |      |      |      |
| 桔红        | 255  | 69   | 0    | 孔雀蓝      | 51   | 161  | 201  |          |      |      |      |
| 深红色      | 255  | 0    | 255  | 土耳其玉色  | 0    | 199  | 140  |          |      |      |      |

 

 

**测试结果**

上传测试代码1成功，上电后，模块上RGB LED循环显示红绿蓝3种颜色，间隔时间为1秒。上传测试代码2成功，上电后，模块上RGB LED显示红橙黄绿蓝青紫白7种颜色，循环不止，间隔时间为1秒。

![img](./media/wps126.png)